
package com.forezp.web;

import com.forezp.annotation.SysLogger;
import com.forezp.config.RabbitConfig;
import com.forezp.dto.RespDTO;
import com.forezp.entity.User;
import com.forezp.service.UserService;
import com.forezp.util.BPwdEncoderUtils;
import io.swagger.annotations.ApiOperation;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {

	@Autowired
	private UserService userService;

	@Value("${server.port}")
	private String port;

	@ApiOperation(value="注册", notes="username和password为必选项")
	@PostMapping("/registry")
	@SysLogger("registry")
	public User createUser(@RequestBody User user) {
		// 参数判读省略,判读该用户在数据库是否已经存在省略
		String entryPassword = BPwdEncoderUtils.BCryptPassword(user.getPassword());
		user.setPassword(entryPassword);
		return userService.createUser(user);
	}

	@SuppressWarnings("rawtypes")
	@ApiOperation(value="登录", notes="username和password为必选项")
	@PostMapping("/login")
	@SysLogger("login")
	public RespDTO login(@RequestParam String username, @RequestParam String password) {
		// 参数判读省略
		return userService.login(username, password);
	}

	@SuppressWarnings("rawtypes")
	@ApiOperation(value="根据用户名获取用户", notes="根据用户名获取用户")
	@PostMapping("/{username}")
	@PreAuthorize("hasRole('USER')")
	@SysLogger("getUserInfo")
//	@PreAuthorize("hasAnyAuthority('ROLE_USER')")
	public RespDTO getUserInfo(@PathVariable("username") String username) {
		// 参数判读省略
		User user = userService.getUserInfo(username);
		return RespDTO.onSuc(user, port);
	}

	@Autowired
	private AmqpTemplate rabbitTemplate;

	@GetMapping("/test")
	public void test() {
		rabbitTemplate.convertAndSend(RabbitConfig.queueName, "Hello from RabbitMQ!");
	}

	@Value("${foo}")
	private String foo = null;

	@GetMapping("/bus/foo")
	public String foo() {
		return foo;
	}
}